package com.example.myapplication01.chapter06.database;

import android.content.ContentValues; // 导入ContentValues类
import android.content.Context; // 导入Context类
import android.database.Cursor; // 导入Cursor类
import android.database.sqlite.SQLiteDatabase; // 导入SQLiteDatabase类
import android.database.sqlite.SQLiteOpenHelper; // 导入SQLiteOpenHelper类

import com.example.myapplication01.chapter06.enity.LoginInfo;

import java.util.ArrayList; // 导入ArrayList类
import java.util.List; // 导入List类

public class LoginDBHelper extends SQLiteOpenHelper { // 定义LoginDBHelper类，继承SQLiteOpenHelper

    private static final String DB_NAME = "login.db"; // 数据库名称
    private static final String TABLE_NAME = "login_info"; // 表名称
    private static final int DB_VERSION = 1; // 数据库版本
    private static LoginDBHelper mHelper = null; // LoginDBHelper实例
    private SQLiteDatabase mRDB = null; // 读数据库实例
    private SQLiteDatabase mWDB = null; // 写数据库实例

    private LoginDBHelper(Context context) { // 构造函数
        super(context, DB_NAME, null, DB_VERSION); // 调用父类构造函数
    }

    // 利用单例模式获取数据库帮助器的唯一实例
    public static LoginDBHelper getInstance(Context context) { // 获取LoginDBHelper实例
        if (mHelper == null) { // 如果实例为空
            mHelper = new LoginDBHelper(context); // 创建新的LoginDBHelper实例
        }
        return mHelper; // 返回实例
    }

    // 打开数据库的读连接
    public SQLiteDatabase openReadLink() { // 打开读连接
        if (mRDB == null || !mRDB.isOpen()) { // 如果读数据库实例为空或未打开
            mRDB = mHelper.getReadableDatabase(); // 获取可读数据库
        }
        return mRDB; // 返回读数据库实例
    }

    // 打开数据库的写连接
    public SQLiteDatabase openWriteLink() { // 打开写连接
        if (mWDB == null || !mWDB.isOpen()) { // 如果写数据库实例为空或未打开
            mWDB = mHelper.getWritableDatabase(); // 获取可写数据库
        }
        return mWDB; // 返回写数据库实例
    }

    // 关闭数据库连接
    public void closeLink() { // 关闭数据库连接
        if (mRDB != null && mRDB.isOpen()) { // 如果读数据库实例不为空且已打开
            mRDB.close(); // 关闭读数据库
            mRDB = null; // 将读数据库实例置为空
        }

        if (mWDB != null && mWDB.isOpen()) { // 如果写数据库实例不为空且已打开
            mWDB.close(); // 关闭写数据库
            mWDB = null; // 将写数据库实例置为空
        }
    }

    // 创建数据库，执行建表语句
    @Override
    public void onCreate(SQLiteDatabase db) { // 创建数据库
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + // 创建表的SQL语句
                "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + // 定义_id字段
                " phone VARCHAR NOT NULL," + // 定义phone字段
                " password VARCHAR NOT NULL," + // 定义password字段
                " remember INTEGER NOT NULL);"; // 定义remember字段
        db.execSQL(sql); // 执行SQL语句
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库
        // 这里没有具体的升级操作
    }

    public void save(LoginInfo info) { // 保存登录信息
        try {
            mWDB.beginTransaction(); // 开始事务
            delete(info); // 删除已有的登录信息
            insert(info); // 插入新的登录信息
            mWDB.setTransactionSuccessful(); // 设置事务成功
        } catch (Exception e) { // 捕获异常
            e.printStackTrace(); // 打印异常信息
        } finally {
            mWDB.endTransaction(); // 结束事务
        }
    }

    public long delete(LoginInfo info) { // 删除登录信息
        return mWDB.delete(TABLE_NAME, "phone=?", new String[]{info.phone}); // 执行删除操作
    }

    public long insert(LoginInfo info) { // 插入登录信息
        ContentValues values = new ContentValues(); // 创建ContentValues对象
        values.put("phone", info.phone); // 插入phone字段
        values.put("password", info.password); // 插入password字段
        values.put("remember", info.remember); // 插入remember字段
        return mWDB.insert(TABLE_NAME, null, values); // 执行插入操作
    }

    public LoginInfo queryTop() { // 查询最新的记住的登录信息
        LoginInfo info = null; // 初始化LoginInfo对象
        String sql = "select * from " + TABLE_NAME + " where remember = 1 ORDER BY _id DESC limit 1"; // 查询SQL语句
        Cursor cursor = mRDB.rawQuery(sql, null); // 执行查询
        if (cursor.moveToNext()) { // 如果有结果
            info = new LoginInfo(); // 创建LoginInfo对象
            info.id = cursor.getInt(0); // 获取_id字段
            info.phone = cursor.getString(1); // 获取phone字段
            info.password = cursor.getString(2); // 获取password字段
            info.remember = (cursor.getInt(3) == 0) ? false : true; // 获取remember字段
        }
        return info; // 返回LoginInfo对象
    }

    public LoginInfo queryByPhone(String phone) { // 根据手机号查询登录信息
        LoginInfo info = null; // 初始化LoginInfo对象
        Cursor cursor = mRDB.query(TABLE_NAME, null, "phone=? and remember=1", new String[]{phone}, null, null, null); // 执行查询
        if (cursor.moveToNext()) { // 如果有结果
            info = new LoginInfo(); // 创建LoginInfo对象
            info.id = cursor.getInt(0); // 获取_id字段
            info.phone = cursor.getString(1); // 获取phone字段
            info.password = cursor.getString(2); // 获取password字段
            info.remember = (cursor.getInt(3) == 0) ? false : true; // 获取remember字段
        }
        return info; // 返回LoginInfo对象
    }
}